package com.lemzdo.community.controller;

import com.lemzdo.community.cache.TagCache;
import com.lemzdo.community.dto.PostDTO;
import com.lemzdo.community.model.Post;
import com.lemzdo.community.model.User;
import com.lemzdo.community.service.PostService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

@Controller//访问publish页面 即发帖页面
public class PublishController {

    @Autowired//注入service用于操作数据库
    private PostService postService;

    /**
     * GET请求，仅仅渲染页面用于调试 或者为提交表单时给页面提供tags
     * @return 返回界面
     */
    @GetMapping(value = "/publish")
    public String publishGet(Model model){
        model.addAttribute("tags",TagCache.getTagDTO());
        return "publish";
    }

    /**
     * post请求，前端表单post方式发回来的数据用于存储到数据库中
     * @param postTitle 前端页面传回来的标题
     * @param postText 前端页面传回来的文本内容
     * @param postTag 前端页面传回来的标签
     * @param id 前端页面传回来的帖子id 作为唯一标识 用来判断是更新帖子还是新发布帖子
     * @return 返回界面
     */
    @PostMapping(value = "/publish")
    //@RequestMapping(value = "/publish")
    public String publishPost(@RequestParam("postTitle") String postTitle,
                              @RequestParam("postText") String postText,
                              @RequestParam("postTag") String postTag,
                              @RequestParam("id") Integer id,
                              HttpServletRequest request, Model model){

        //将获取到的用户填写的标题，文本，标签，所有的标签缓存放入model中，方便前端取用
        model.addAttribute("postTitle",postTitle);
        model.addAttribute("postText",postText);
        model.addAttribute("postTag",postTag);
        model.addAttribute("tags", TagCache.getTagDTO());

        //判断前端页面传回来的文本内容是否为空（实际开发中前后端都需要判断）
        if(StringUtils.isBlank(postTitle)){
            model.addAttribute("error","标题不能为空");
            //返回发帖页面，并展示错误
            return "publish";
        }

        if(StringUtils.isBlank(postText)){
            model.addAttribute("error","文本内容不能为空");
            //返回发帖页面，并展示错误
            return "publish";
        }

        if (StringUtils.isBlank(postTag)) {
            model.addAttribute("error", "标签不能为空");
            return "publish";
        }
        if (!TagCache.tagLegal(postTag)) {
            model.addAttribute("error", "标签不合法");
            return "publish";
        }




        //获取session域中的user对象
        User user = (User) request.getSession().getAttribute("user");
        //若session域中没有user 报错 返回错误信息给前端页面用于展示弹框
        if(user==null){
            model.addAttribute("error","用户未登录");
            //返回发帖页面，并展示错误
            return "publish";
        }
        //新建一个model Post对象 用于存放前端传回来的数据
        Post post = new Post();

        post.setTitle(postTitle);
        post.setText(postText);
        post.setTag(postTag);
        post.setAuthorId(user.getId());
        post.setId(id);

        //插入post数据到数据库 需要判断帖子是否存在 存在就修改，不存在就插入
        postService.createOrUpdate(post);
        //返回主页面，并显示发帖的信息
        return "redirect:/";
    }


    @RequestMapping(value = "/publish/{id}")
    public String postEdit(@PathVariable Integer id,Model model){
        //根据帖子id 去数据库中获取对应的帖子信息
        PostDTO postDTO = postService.selectByPrimaryKey(id);
        //将获取到的帖子的的标题，文本，标签，id 放入model中，方便前端取用
        model.addAttribute("postTitle",postDTO.getTitle());
        model.addAttribute("postText",postDTO.getText());
        model.addAttribute("postTag",postDTO.getTag());
        model.addAttribute("id",postDTO.getId());
        model.addAttribute("tags", TagCache.getTagDTO());


        return "publish";
    }




}
